package com.itheima.devops.writeQueue;

import java.util.ArrayList;
import java.util.List;   
import java.util.concurrent.atomic.AtomicReference;
   
/**
   * 桶数据结构，包含数据及状态信息
   */   
public class Bucket<T> {
    // 桶状态枚举
    public enum BucketStatus {
        WRITABLE,       // 可写状态
        READ_ONLY,      // 只读状态（等待消费）
        CONSUMING,      // 消费中
        CONSUMED        // 已消费
    }

    private final long createTimestamp;      // 创建时间戳
    private final List<T> data;              // 存储的数据
    private final int maxSize;               // 桶最大容量
    private AtomicReference<BucketStatus> status;  // 桶状态（原子引用保证线程安全）

    public Bucket(int maxSize) {
        this.createTimestamp = System.currentTimeMillis();
        this.data = new ArrayList<>();
        this.maxSize = maxSize;
        this.status = new AtomicReference<>(BucketStatus.WRITABLE);
    }

    // 添加数据到桶中（仅在WRITABLE状态可用）
    public synchronized boolean addData(T item) {
        if (status.get() == BucketStatus.WRITABLE && data.size() < maxSize) {
            data.add(item);
            return true;
        }
        return false;
    }

    // 获取桶中所有数据（消费后状态会变为CONSUMING）
    public synchronized List<T> consumeData() {
        if (status.compareAndSet(BucketStatus.READ_ONLY, BucketStatus.CONSUMING)) {
            return new ArrayList<>(data);
        }
        return null;
    }

    // 标记桶为已消费状态（清空数据）
    public synchronized void markAsConsumed() {
        if (status.compareAndSet(BucketStatus.CONSUMING, BucketStatus.CONSUMED)) {
            data.clear();
        }
    }

    // 检查桶是否可写
    public synchronized boolean isWritable() {
        return status.get() == BucketStatus.WRITABLE;
    }

    // 标记桶为只读状态（刷新操作时调用）
    public synchronized boolean markAsReadOnly() {
        return status.compareAndSet(BucketStatus.WRITABLE, BucketStatus.READ_ONLY);
    }

    // 获取当前数据量
    public synchronized int size() {
        return data.size();
    }

    // 获取创建时间
    public long getCreateTimestamp() {
        return createTimestamp;
    }

    // 获取当前状态
    public BucketStatus getStatus() {
        return status.get();
    }   
}
